package cn.zbh.basic.service.impl;
import cn.zbh.basic.constant.RegisterConstant;
import cn.zbh.basic.exception.BusinessException;
import cn.zbh.basic.service.IVerifyCodeService;
import cn.zbh.basic.util.StrUtils;
import cn.zbh.basic.util.VerifyCodeUtils;

import cn.zbh.user.domain.User;
import cn.zbh.user.mapper.UserMapper;
import org.omg.CORBA.TIMEOUT;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserMapper userMapper;
    /**
     * 图片验证码
     * @param key
     * @return
     */
    @Override
    public String verifyCode(String key) {
        //1.校验
        if(StringUtils.isEmpty(key)){
            throw new BusinessException("操作问题");
        }

        //2.生成随机验证码
        String code = StrUtils.getComplexRandomString(4);
        //3.存入redis 设置过期时间
        redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES);
        //4.生成64base字符串
       return VerifyCodeUtils.verifyCode(100, 50, code);

    }
    /**
     * phone.imageCode.base64ImageCode
     * 手机验证码
     * @return
     */

    @Override
    public void smsCode( Map<String, String> map) {
        String phone = map.get("phone");
        String imageCode = map.get("imageCode");
        String imageCodeKey = map.get("imageCodeKey");
//1.参数不为空校验
        if(StringUtils.isEmpty(phone)
            ||StringUtils.isEmpty(imageCode)
            ||StringUtils.isEmpty(imageCodeKey)
        ){
            throw new BusinessException("参数不能为空");
        }
        //2.图像验证码校验
        Object o = redisTemplate.opsForValue().get(imageCodeKey);
        if(o==null){
            throw new BusinessException("图形验证码过期");
        }
        if(!o.toString().equalsIgnoreCase(imageCode)){
            throw new BusinessException("图形验证码输入错误");
        }
        //3.手机号是否注册
       User user= userMapper.getPhone(phone);
        if(user!=null){//查到了  已被注册
            throw new BusinessException("手机号已被注册");

        }
        //4.判断是否第一次请求 或者验证码验证码是否过期 从redis中取
        /**
         * key:手机号+业务键
         * value： 验证码：时间戳
         */
        Object value = redisTemplate.opsForValue().get(phone + RegisterConstant.PHONEREGISTER);
        String code=null;
        if(value==null){//没取到
            //4.1如果娶不到 没有发送过，获取过期了 redis中重新获取
            code=StrUtils.getComplexRandomString(4);
            redisTemplate.opsForValue().set(phone+RegisterConstant.PHONEREGISTER,code,3,TimeUnit.MINUTES);
        }else {
            //4.2如果取到了，是否超过一分钟
            String time= value.toString().split(":")[1];
            long l = Long.parseLong(time);//转为long

            if(System.currentTimeMillis()-l>1*60*1000){
                //4.2.1 如果没超过一分钟，提示用户一分钟之内不可发送多次
                throw new BusinessException("一分钟内只能发送一次");
            }else {

                //4.2.2如果超过一分钟 重新刷新过期时间
                code=value.toString().split(":")[0];
                redisTemplate.opsForValue().set(phone+"phoneRegister",code,3,TimeUnit.MINUTES);
        }

        }


        //发送短信给用户
        // SmsUtils.sendSms(phone,"你的验证码为："+code);
        System.out.println("你的验证码为"+code);

    }

    /**
     * 绑定验证码    微信登录
     * @param map
     */
    @Override
    public void binderSmsCode(Map<String, String> map) {
        String phone = map.get("phone");

//1.参数不为空校验
        if(StringUtils.isEmpty(phone)){
            throw new BusinessException("电话不能为空");
        }

        //4.判断是否第一次请求 或者验证码验证码是否过期 从redis中取
        /**
         * key:手机号+业务键
         * value： 验证码：时间戳
         */
        Object value = redisTemplate.opsForValue().get(phone + RegisterConstant.WXBINDER);
        String code=null;
        if(value==null){//没取到
            //4.1如果娶不到 没有发送过，获取过期了 redis中重新获取
            code=StrUtils.getComplexRandomString(4);
            redisTemplate.opsForValue().set(phone+RegisterConstant.WXBINDER,code,3,TimeUnit.MINUTES);
        }else {
            //4.2如果取到了，是否超过一分钟
            String time= value.toString().split(":")[1];
            long l = Long.parseLong(time);//转为long

            if(System.currentTimeMillis()-l>1*60*1000){
                //4.2.1 如果没超过一分钟，提示用户一分钟之内不可发送多次
                throw new BusinessException("一分钟内只能发送一次");
            }else {

                //4.2.2如果超过一分钟 重新刷新过期时间
                code=value.toString().split(":")[0];
                redisTemplate.opsForValue().set(phone+"phoneRegister",code,3,TimeUnit.MINUTES);
            }

        }


        //发送短信给用户
        // SmsUtils.sendSms(phone,"你的验证码为："+code);
        System.out.println("你的验证码为"+code);
    }
}
